// 类型定义必须放在函数外部
// ignore_for_file: unnecessary_type_check

typedef IntList = List<int>;

void main() {
  // 1. 基本类型示例
  print('=== 基本类型示例 ===');
  // 数字类型
  var x = 1;
  var hex = 0xDEADBEEF;
  var y = 1.1;
  var exponents = 1.42e5;
  print('整数: $x, 十六进制: $hex, 浮点数: $y, 科学计数法: $exponents');

  // 字符串
  var s1 = '单引号字符串';
  var s2 = "双引号字符串";
  var s3 = '可以嵌入表达式: ${s1.toUpperCase()}';
  print('$s1, $s2, $s3');

  // 布尔值
  var fullName = '';
  print('fullName是否为空: ${fullName.isEmpty}');

  // 2. 记录类型示例
  print('\n=== 记录类型示例 ===');
  var record = ('first', a: 2, b: true, 'last');
  print('记录: $record');
  print('记录字段1: ${record.$1}');
  var (first, a: aValue, b: isTrue, last) = record;
  print('解构结果: $first, $aValue, $isTrue, $last');

  // 3. 集合操作示例
  print('\n=== 集合操作示例 ===');
  // 列表操作
  var numbers = [1, 2, 3];
  numbers.add(4);
  print('列表: $numbers');
  print('第一个元素: ${numbers.first}');
  print('最后一个元素: ${numbers.last}');

  // 集合操作
  var halogens = {'fluorine', 'chlorine', 'bromine'};
  halogens.add('iodine');
  print('集合: $halogens');
  print('包含fluorine: ${halogens.contains('fluorine')}');

  // 映射操作
  var gifts = {'first': 'partridge', 'second': 'turtledoves'};
  gifts['third'] = 'golden rings';
  print('映射: $gifts');
  print('键集合: ${gifts.keys}');

  // 4. 泛型示例
  print('\n=== 泛型示例 ===');
  var names = <String>['Alice', 'Bob'];
  var uniqueNames = <String>{'Alice', 'Bob'};
  var pages = <String, String>{'index.html': 'Homepage', 'about.html': 'About'};
  print('泛型列表: $names');
  print('泛型集合: $uniqueNames');
  print('泛型映射: $pages');

  // 5. 类型系统示例
  print('\n=== 类型系统示例 ===');
  IntList il = [1, 2, 3];
  print('类型别名列表: $il');
  print('il是List<int>: ${il is List<int>}');

  // 泛型函数
  T firstItem<T>(List<T> items) => items.first;
  print('第一个字符串: ${firstItem<String>(['a', 'b'])}');
  print('第一个数字: ${firstItem<int>([1, 2])}');
}
